package cn.like.common.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * @author <a href="mailto:likelovec@gmail.com">like</a>
 * @date 2021/7/19 10:32
 */
@Slf4j
public abstract class BaseExcelListener<T> extends AnalysisEventListener<T> {

    private static final int MAX_BATCH_COUNT = 2000;

    /**
     * 获取数据列表
     * <pre>
     *     List<T> dataList = new ArrayList<T>();
     * </pre>
     *
     * @return {@link List<T>}
     */
    public abstract List<T> getDataList();

    /**
     * 保存数据
     * <pre>
     *     xxxDao.batchInsert(dataList);
     * </pre>
     */
    protected abstract void saveData();

    /**
     * 对读取的数据进行处理。
     * <pre>
     *     如果不需要，请直接返回传入的对象
     * </pre>
     *
     * @param t t
     * @return {@link T}
     */
    protected  T process(T t){
        return t;
    }

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        getDataList().add(process(t));
        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
        if (getDataList().size() >= MAX_BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            getDataList().clear();
        }
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        saveData();
    }
}
